import socket
import threading
import time

# 配置信息
UID = "57ea5d4ca88f43cc96a3db030dd36496"  # 你的巴法云密钥
SERVER_ADDR = ("tcp.bemfa.com", 8344)      # 巴法云TCP服务器
SUB_TOPIC = "led"                          # 要订阅的主题
PUB_TOPIC = "temp"                         # 要发布的主题

def recv_msg(sock):
    """接收服务器消息的线程函数（处理订阅的led主题消息）"""
    while True:
        try:
            # 接收数据（缓冲区1024字节）
            data = sock.recv(1024).decode("utf-8")
            if not data:
                print("连接已断开，尝试重连...")
                break  # 断开后退出循环，触发重连
            
            # 解析收到的消息（格式：topic=xxx&msg=xxx\r\n）
            if "topic=" in data and "msg=" in data:
                # 提取主题和消息内容
                parts = data.strip().split("&")
                topic = parts[2].split("=")[1]
                msg = parts[3].split("=")[1]
                print(f"收到主题 {topic} 的消息：{msg}")
        
        except Exception as e:
            print(f"接收消息出错：{e}")
            break

def pub_temp(sock):
    """定时向temp主题发布数据的函数"""
    temp = 20
    while True:
        try:
            # 模拟温度数据（实际应用中可替换为传感器读数）
            temp += 0.5 # 25~30之间波动
            # 构造发布命令
            pub_cmd = f"cmd=2&uid={UID}&topic={PUB_TOPIC}&msg={temp}\r\n"
            # 发送命令（需编码为bytes）
            sock.send(pub_cmd.encode("utf-8"))
            print(f"已向 {PUB_TOPIC} 发布：{temp}")
            time.sleep(5)  # 每5秒发布一次
        
        except Exception as e:
            print(f"发布消息出错：{e}")
            break

def main():
    while True:  # 断开后自动重连
        try:
            # 1. 创建TCP socket
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            # 2. 连接巴法云服务器
            sock.connect(SERVER_ADDR)
            print(f"成功连接到 {SERVER_ADDR}")
            
            # 3. 发送鉴权命令（订阅led主题）
            sub_cmd = f"cmd=1&uid={UID}&topic={SUB_TOPIC}\r\n"
            sock.send(sub_cmd.encode("utf-8"))
            print(f"已订阅主题：{SUB_TOPIC}")
            
            # 4. 启动接收消息的线程（单独线程避免阻塞发送）
            recv_thread = threading.Thread(target=recv_msg, args=(sock,), daemon=True)
            recv_thread.start()
            
            # 5. 开始发布temp主题数据
            pub_temp(sock)
        
        except Exception as e:
            print(f"连接出错：{e}，10秒后重试...")
            time.sleep(10)
        finally:
            # 断开连接时关闭socket
            sock.close()
            print("连接已关闭")

if __name__ == "__main__":
    main()

